package service;

import java.util.ArrayList;
import java.util.List;

import persistencia.AdministradorPersistencia;
import bean.Cliente;
import bean.CondicionPago;
import bean.DescuentoPorCantidad;
import bean.Direccion;
import bean.VOList;
import bean.vo.ClienteVO;
import bean.vo.CondicionPagoVO;
import bean.vo.DescuentoPorCantidadVO;
import bean.vo.RemitoClienteVO;

@SuppressWarnings({"unchecked"})
public class ServiciosCliente {

	protected static Cliente buscarCliente(String cuit) throws Exception {
		return (Cliente) SistemaCVR.getInstancia().buscarEntidad(new Cliente(cuit));
	}
	
	public static ClienteVO buscarCliente (ClienteVO cliente) throws Exception{
		Cliente cli = ServiciosCliente.buscarCliente(cliente.getCuit());
		return cli != null ? cli.getVO() : null;
	}
	
	public static ArrayList <ClienteVO> getClientes() throws Exception{
		return new VOList<ClienteVO>().getVoList(SistemaCVR.getInstancia().getEntidades(Cliente.class.getName()));
	}
	
	public static void crearCliente(ClienteVO cliente) throws Exception{		
		if (ServiciosCliente.buscarCliente(cliente) == null ){
			Direccion direccion = ServiciosDireccion.crearDireccion(cliente.getDireccion());
			Cliente cli = new Cliente(cliente.getCuit(), cliente.getRazonSocial(), cliente.getTelefono(), direccion);
			cli.setDescuentoPagoContado(cliente.getDescuentoPagoContado());
			SistemaCVR.getInstancia().agregarEntidad(cli);
		} else {
			throw new Exception("Ya existe un cliente con el CUIT ingresado.");	
		}
	}
	
	public static void eliminarCliente(ClienteVO cliente) throws Exception{
		Cliente cli = ServiciosCliente.buscarCliente(cliente.getCuit());
		if (cli != null ){
			SistemaCVR.getInstancia().eliminarEntidad(cli);
		} else {
			throw new Exception("No existe un cliente con el CUIT ingresado.");
		}
	}
	
	public static void modificarCliente(ClienteVO cliente) throws Exception{
		Cliente cli = ServiciosCliente.buscarCliente(cliente.getCuit());
		if (cli != null ){
			cli.setRazonSocial(cliente.getRazonSocial());
			cli.setTelefono(cliente.getTelefono());
			cli.setDescuentoPagoContado(cliente.getDescuentoPagoContado());
			
			SistemaCVR.getInstancia().modificarEntidad(cli);
		} else {
			throw new Exception("No existe un cliente con el CUIT ingresado.");
		}
	}
	
	public static void agregarCondicionPagoACliente(ClienteVO cliente, CondicionPagoVO cond) throws Exception{
		Cliente cli = ServiciosCliente.buscarCliente(cliente.getCuit());
		CondicionPago cp = ServiciosCondicionPago.buscarCondicionDePago(cond.getNombre());
		if (cli != null && cp != null){
			if(cli.agregarCondicionPago(cp)){
				try {
					AdministradorPersistencia.getInstancia().persistir(cli);
				} catch (Exception e) {
					throw new Exception("Error al agregar condicion de pago al cliente.");
				}
			}
		}
	}
	
	public static void eliminarCondicionPagoACliente(ClienteVO cliente, CondicionPagoVO cond) throws Exception{
		Cliente cli = ServiciosCliente.buscarCliente(cliente.getCuit());
		CondicionPago cp = ServiciosCondicionPago.buscarCondicionDePago(cond.getNombre());
		if (cli != null && cp != null){
			if(cli.eliminarCondicionPago(cp)){
				try {
					AdministradorPersistencia.getInstancia().persistir(cli);
				} catch (Exception e) {
					throw new Exception("Error al eliminar condicion de pago al cliente.");
				}
			}
		}
	}
	
	public static void agregarDescuentoACliente(ClienteVO cliente, DescuentoPorCantidadVO desc) throws Exception{
		Cliente cli = ServiciosCliente.buscarCliente(cliente.getCuit());
		DescuentoPorCantidad dpc = ServiciosDescuentoPorCantidad.buscarDescuentoPorCantidad(desc.getCantidadMinima());
		if (cli != null && dpc != null){
			if(cli.agregarDescuentoPorCantidad(dpc)){
				try {
					AdministradorPersistencia.getInstancia().persistir(cli);
				} catch (Exception e) {
					throw new Exception("Error al agregar descuento de pago al cliente.");
				}
			}
		}
	}
	
	public static void eliminarDescuentoACliente(ClienteVO cliente, DescuentoPorCantidadVO desc) throws Exception{
		Cliente cli = ServiciosCliente.buscarCliente(cliente.getCuit());
		DescuentoPorCantidad dpc = ServiciosDescuentoPorCantidad.buscarDescuentoPorCantidad(desc.getCantidadMinima());
		if (cli != null ){
			if(cli.eliminarDescuentoPorCantidad(dpc)){
				try {
					AdministradorPersistencia.getInstancia().persistir(cli);
				} catch (Exception e) {
					throw new Exception("Error al eliminar descuento de pago al cliente.");
				}
			}
		}
	}

}
